package com.example.aimultimodel.tools;

import org.springframework.ai.tool.annotation.Tool;

import java.nio.charset.StandardCharsets;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.ArrayList;
import java.util.List;

/**
 * @author 18747
 */
public class FolderContentReaderTool {
    // 最大读取文件大小（1MB），避免读取超大文件导致内存溢出
    private static final long MAX_FILE_SIZE = 1024 * 1024;

    // 支持读取的文本文件扩展名
    private static final List<String> SUPPORTED_EXTENSIONS = List.of(
            "txt", "java", "xml", "json", "md", "html", "css", "js", "properties"
    );

    /**
     * 读取指定文件夹及其所有子文件夹下的文件路径和文本内容
     * @param folderPath 文件夹的完整路径（例如：/home/user/docs 或 C:/data/files）
     * @return 包含所有文件信息的字符串，格式为"文件路径: 内容（若可读）"
     */
    @Tool(description = "读取指定文件夹及其子文件夹下的所有文件路径和文本内容，参数为文件夹的完整路径。自动过滤二进制文件和超过1MB的文件。")
    public String readFolderAndSubfolders(String folderPath) {
        Path rootPath;
        try {
            rootPath = Paths.get(folderPath);
        } catch (InvalidPathException e) {
            return "路径无效：" + e.getMessage();
        }

        // 检查文件夹是否存在且为目录
        if (!Files.exists(rootPath)) {
            return "文件夹不存在：" + folderPath;
        }
        if (!Files.isDirectory(rootPath)) {
            return "指定路径不是文件夹：" + folderPath;
        }

        List<String> result = new ArrayList<>();
        result.add("开始读取文件夹：" + folderPath + "\n");

        try {
            // 递归遍历所有文件
            Files.walkFileTree(rootPath, new SimpleFileVisitor<Path>() {
                @Override
                public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
                    // 只处理文件（排除目录）
                    if (Files.isRegularFile(file)) {
                        try {
                            // 检查文件大小
                            long fileSize = Files.size(file);
                            if (fileSize > MAX_FILE_SIZE) {
                                result.add("文件过大（超过1MB），跳过：" + file.toAbsolutePath());
                                return FileVisitResult.CONTINUE;
                            }

                            // 检查文件扩展名是否支持
                            String fileName = file.getFileName().toString();
                            String extension = getFileExtension(fileName);
                            if (!SUPPORTED_EXTENSIONS.contains(extension.toLowerCase())) {
                                result.add("不支持的文件类型，跳过：" + file.toAbsolutePath());
                                return FileVisitResult.CONTINUE;
                            }

                            // 读取文本内容
                            List<String> lines = Files.readAllLines(file, StandardCharsets.UTF_8);
                            String content = String.join("\n", lines);
                            result.add("文件路径：" + file.toAbsolutePath() + "\n内容：\n" + content + "\n---");

                        } catch (Exception e) {
                            result.add("读取文件失败 " + file.toAbsolutePath() + "：" + e.getMessage());
                        }
                    }
                    return FileVisitResult.CONTINUE;
                }

                public FileVisitResult visitFileFailed(Path file, Exception e) {
                    result.add("访问文件失败 " + file.toAbsolutePath() + "：" + e.getMessage());
                    return FileVisitResult.CONTINUE;
                }
            });

            result.add("\n文件夹读取完成，共处理 " + (result.size() - 1) + " 个条目");
            return String.join("\n", result);

        } catch (Exception e) {
            return "遍历文件夹时发生错误：" + e.getMessage();
        }
    }

    // 提取文件扩展名（不含"."）
    private String getFileExtension(String fileName) {
        int lastDotIndex = fileName.lastIndexOf('.');
        return (lastDotIndex == -1) ? "" : fileName.substring(lastDotIndex + 1);
    }
}
